package Dao;

import java.util.ArrayList;
import java.util.List;



import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import Negocio.ListaPreciosCPR;
import Negocio.MovimientoStock;
import Negocio.Rodamiento;
import Negocio.Stock;
import Persistencia.HibernateUtil;

public class RodamientoDao {

	private static RodamientoDao instancia = null;
	private static SessionFactory sf = null;
	
	public static RodamientoDao getInstancia() {
		if(sf==null || sf.isClosed())
			sf = HibernateUtil.getSessionFactory();
		if(instancia == null){
			instancia = new RodamientoDao();
		} 
		return instancia;
	}

	public void grabarRodamiento(Rodamiento rodamiento) {
		Session session = sf.openSession();
		session.beginTransaction();
		session.save(rodamiento.getStock());
		session.save(rodamiento);
		session.flush();
		session.getTransaction().commit();
		session.close();
	}

	public void grabarMovimiento(MovimientoStock mov) {
		Session session = sf.openSession();
		session.beginTransaction();
		session.save(mov);
		session.flush();
		session.getTransaction().commit();
		session.close();
	}
	
	public void grabarStock(Stock mov) {
		Session session = sf.openSession();
		session.beginTransaction();
		session.update(mov);
		session.flush();
		session.getTransaction().commit();
		session.close();
	}
	
	public Rodamiento buscarRodamiento(int id) {
		Session session = sf.openSession();
		session.beginTransaction();
		Rodamiento rodamiento = (Rodamiento)session.get(Rodamiento.class, id);
		session.flush();
		session.getTransaction().commit();
		session.close();
		return rodamiento;
	}	
	
	public Rodamiento buscarRodamiento(String codigo) {
		Session session = sf.openSession();
		session.beginTransaction();
		
		Query query = session.createQuery("from Rodamiento where codigo = ? ");
		query.setString(0,codigo);
		List<Rodamiento> l = (List<Rodamiento>) query.list();
		Rodamiento rodamiento = null;
		if(l!=null && l.size()>0) rodamiento = l.get(0);
		session.flush();
		session.getTransaction().commit();
		session.close();
		return rodamiento;
	
		
//		PaisOrigen paisOrigen = (PaisOrigen)session.get(PaisOrigen.class, origen);
		
	}

	public List<Rodamiento> buscarRodamientosXCodigo(String codigo) {
		Session session = sf.openSession();
		session.beginTransaction();
		System.out.println("RodamientoDao::buscarRodamientosXCodigo("+codigo+")");
		Query query = session.createQuery("from Rodamiento where codigo = ? ");
		query.setString(0,codigo);
		List<Rodamiento> l = (List<Rodamiento>) query.list();
		if(l!=null)System.out.println("List<Rodamientos>.size(): " + Integer.toString(l.size()));
		session.flush();
		session.getTransaction().commit();
		session.close();
		return l;
	
		
//		PaisOrigen paisOrigen = (PaisOrigen)session.get(PaisOrigen.class, origen);
		
	}
	
	public Rodamiento buscarRodamiento(String codigo,String  marca, String origen) {
		Session session = sf.openSession();
		session.beginTransaction();
		Query query = session.createQuery("from Rodamiento where codigo = ? and marca = ? and origen = ?");
		query.setString(0,codigo);
		query.setString(1,marca);
		query.setString(2,origen);
		Rodamiento rodamiento = (Rodamiento) query.uniqueResult();
		session.flush();
		session.getTransaction().commit();
		session.close();
		return rodamiento;
	}

	public List<Rodamiento> buscarRodamientosMarcaOrig(String  marca, String origen) {
		Session session = sf.openSession();
		session.beginTransaction();
		Query query = session.createQuery("from Rodamiento where marca = ? and origen = ?");
		query.setString(0,marca);
		query.setString(1, origen);
		List<Rodamiento> rodamiento = (List<Rodamiento>) query.list();
		session.flush();
		session.getTransaction().commit();
		session.close();
		return rodamiento;
		
	}

	public void modificarRodamiento(Rodamiento rod) {
		Session session = sf.openSession();
		session.beginTransaction();
		session.update(rod);
		session.flush();
		session.getTransaction().commit();
		session.close();		
	}

	public void borrarRodamiento(int codigo) {
		Session session = sf.openSession();
		session.beginTransaction();
		Rodamiento rodamiento = (Rodamiento)session.get(Rodamiento.class, codigo);
		session.delete(rodamiento);
		session.flush();
		session.getTransaction().commit();
		session.close();		
	}

	public List<Rodamiento> obtenerRodamientos() {
		Session session = sf.openSession();
		session.beginTransaction();
		List<Rodamiento> rodamientos = (List<Rodamiento>)session.createQuery("from Rodamiento").list();		
		session.flush();
		session.getTransaction().commit();
		session.close();
		return rodamientos;
	}

	public List<Rodamiento> buscarRodamientoXCodigoYMarca(String codigo, String marca) {

		Session session = sf.openSession();
		session.beginTransaction();
		Query query = session.createQuery("from Rodamiento where codigo = ? and marca = ?");
		query.setString(0, codigo);
		query.setString(1, marca);
		List<Rodamiento> rod = (List<Rodamiento>) query.list();
		session.flush();
		session.getTransaction().commit();
		session.close();
		return rod;
	}

	public List<Rodamiento> buscarRodamientoXCodigoYOrigen(String codigo, String origen) {

		Session session = sf.openSession();
		session.beginTransaction();
		Query query = session.createQuery("from Rodamiento where codigo = ? and origen = ?");
		query.setString(0, codigo);
		query.setString(1, origen);
		List<Rodamiento> rod = (List<Rodamiento>) query.list();
		session.flush();
		session.getTransaction().commit();
		session.close();
		return rod;
	}
	
	public void borrarRodamiento(String codigo, String marca) {
		Rodamiento rodamiento = buscarRodamientoXCodigoYMarca(codigo, marca).get(0);		
		Session session = sf.openSession();
		session.beginTransaction();		
		session.delete(rodamiento);
		session.flush();
		session.getTransaction().commit();
		session.close();				
	}

	public ArrayList<MovimientoStock> getMovimientos(Stock stock) {
		Session session = sf.openSession();
		session.beginTransaction();
		Query query = session.createQuery("from MovimientoStock where stock = ?");
		query.setInteger(0,stock.getId() );
		ArrayList<MovimientoStock> mov = new ArrayList<MovimientoStock>(query.list());
		session.flush();
		session.getTransaction().commit();
		session.close();
		return mov;
	}	
	


}